#include <sys/ptrace.h>
#include <sys/wait.h>
#include <sys/reg.h>
#include <unistd.h>
#include <syscall.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char** argv)
{
	pid_t child = fork();
//	printf("child pid:%d\n",child);
	if (child==-1) { perror("Error haciendo fork"); return 1; }
	if (child==0)
	{
//		printf("HIJO\n");
		if (ptrace(PTRACE_TRACEME,0,NULL,NULL)==-1)
		{
			perror("Error haciendo ptrace(TRACE_TRACEME,...)");
			exit(1);
		}
		execvp(argv[1],argv+1);
		perror("Error child exec(...)");
		exit(1);
	}
	else
	{
		int status;
		while(1)
		{
//			printf("PADRE\n");
			if (wait(&status)<0)
			{
				perror("Error en wait() padre");
				break;
			}
//			printf("wait pid:%d\n",wait_pid);	
			
			if ( WIFSTOPPED(status) )
			{
				int sysno = ptrace(PTRACE_PEEKUSER,child,4*ORIG_EAX,NULL);
//				printf("SYSNO:%d\n",sysno);
				if ( sysno==2 || sysno==120 )
				/*printf("paro por signal %d\n",WSTOPSIG(status));
				if ((WSTOPSIG(status)==2 || WSTOPSIG(status)==120 )*/
				{
					perror("Syscall prohibida");
					ptrace(PTRACE_KILL,child,NULL,NULL);
					break;
				}
			}
			
			if (WIFEXITED(status)) break;
			
			ptrace(PTRACE_SYSCALL,child,NULL,NULL);
		}
		
		ptrace(PTRACE_DETACH,child,NULL,NULL);
	}
	
	return 0;
}
